package com.example.springbootjavafx.view;

import com.example.springbootjavafx.util.SpringContextUtil;
import de.saxsys.mvvmfx.FxmlView;
import de.saxsys.mvvmfx.InjectViewModel;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.layout.BorderPane;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * HelloView类是MVVMFX框架中的FxmlView实现类，用于展示欢迎界面。
 * 它通过双向数据绑定和事件处理方法与HelloViewModel交互。
 */
@Component
@Slf4j
public class HelloView implements FxmlView<HelloViewModel> {

    // 注入ViewModel，用于绑定视图和模型
    @InjectViewModel
    private HelloViewModel viewModel;
    // 标签用于展示欢迎文本
    @FXML
    private Label welcomeText;
    // 标签用于展示动态消息
    @FXML
    private Label message;
    // 文本字段用于输入用户名
    @FXML
    private TextField name;
    @FXML
    private MenuItem list;
    @FXML
    private Button actionButton;



    @FXML
    public void onNotifyClick(ActionEvent actionEvent) {
       viewModel.notifyMessage();
    }
    /**
     * 当“Hello”按钮被点击时触发的方法。
     * 通过调用TestService获取欢迎消息，并将其显示在welcomeText标签上。
     */
    @FXML
    protected void onHelloButtonClick() {
//        welcomeText.setText(testService.getHello());//直接赋值用法
		viewModel.sayHelloMessage();
    }

    /**
     * 当“我的按钮”被点击时触发的方法。
     * 通过调用CLibrary的hello_dog_name方法展示动态链接库的调用结果。
     *
     * @param actionEvent 表示按钮点击事件的对象。
     */
    @FXML
    public void onMyButtonClick(ActionEvent actionEvent) {
//        welcomeText.setText(CLibrary.INSTANCE.hello_dog_name("jna调用动态链接库"));//直接赋值用法
		// 通过JNA调用动态链接库获取狗的名字，并更新视图模型中的消息属性
		viewModel.sayMyMassage();

    }
    /**
     * 当用户触发前往列表操作时调用此方法。
     * 该方法负责加载ListView的视图和视图模型，并将其设置为主窗口的中心部分。
     *
     * @param actionEvent 该事件对象代表了触发此动作的事件。
     */
    @FXML
    public void gotoList(ActionEvent actionEvent) {
        viewModel.gotoList(actionEvent);
    }


    /**
     * 当点击前往主界面的按钮时触发的事件处理方法。
     * 此方法通过FluentViewLoader加载HelloView，并将其设置为主界面的中心部分。
     *
     * @param actionEvent 事件对象，代表按钮被点击的事件。
     */
    @FXML
    public void gotoMain(ActionEvent actionEvent) {
        viewModel.goMain(actionEvent);
    }

    /**
     * 初始化视图控件并建立与ViewModel的绑定。
     * 这是在FXML加载完成后调用的方法。
     */
    public void initialize() {
        // 将name文本字段的文本属性与viewModel的name属性双向绑定
        viewModel.getName().bindBidirectional(name.textProperty());
        // 将message标签的文本属性与viewModel的message属性单向绑定
        message.textProperty().bind(viewModel.getMessage());
		// 将欢迎文本的属性绑定到视图模型中的问候消息属性
		// 这样，当视图模型中的问候消息改变时，欢迎文本也会自动更新
		welcomeText.textProperty().bind(viewModel.getMessageHello());



        Alert alert1 = new Alert(Alert.AlertType.INFORMATION);
        // 订阅消息中心的"message"主题，以获取相关消息通知
        viewModel.userDetailScope.subscribe("message", (key, value) -> {
            // 输出接收到的消息内容
            alert1.setHeaderText("通过实体类继承Scope接口订阅获得的消息");
            alert1.setContentText(Arrays.stream(value).toList().get(0).toString());
            alert1.show();
        });

        viewModel.subscribe("message1", (key, value) -> {
            // 输出接收到的消息内容
            Alert alert2 = new Alert(Alert.AlertType.INFORMATION);
            alert2.setX(alert1.getX());
            alert2.setY(alert1.getY()+alert1.getHeight());
            alert2.setHeaderText("这是通过ViewModel订阅获得的消息");
            alert2.setContentText(Arrays.stream(value).toList().get(0).toString());
            alert2.show();
        });



    }

}
